package com.lcc.ioc.demos.web.controller;

import com.lcc.ioc.demos.web.configuration.UserInfo;
import com.lcc.ioc.demos.web.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

@Controller
public class UserController {
    //通过@Controller告诉Spring帮我管理这个对象

    //依赖注入-属性注入:通过@Autowired注释
    @Qualifier("userInfo2")//在不使用@Autowired，直接使用@Qualifier是拿不到该对象的，而单独使用@Resource(name="userInfo2")是可以的
    //使用@Qualifier指定bean(对象）
//    @Autowired
    private UserInfo user;
    @Autowired
     private UserService userService;
//    @Qualifier("userInfo2")
    //使用@Qualifier指定bean(对象）
//    @Autowired
//    private UserInfo user;//此时存在两个UserInfo对象，且名称都不能匹配user， 故在方法注解@Bean进行创建对象的时候需要在使用@Primary注解来标识默认的对象是哪一个
    //使用 @Resource指定使用的对象（里面的name就是使用的对象的名称）
//    @Resource(name="userInfo2")
//    private UserInfo user;
// 依赖注入-构造方法注入
//    private UserService userService;
//    //加上另一个属性
//    private UserInfo userInfo;
//
////    public UserController() {
////    }
//    @Autowired
//    public UserController(UserService userService) {
//        this.userService = userService;
//    }
//
//    public UserController(UserService userService, UserInfo userInfo) {
//        this.userService = userService;
//        this.userInfo = userInfo;
//    }
    //当上面三个构造函数同时存在的时候，会报空指针异常，会判定下面的doController里面的userService是null,因为有无参构造函数的时候，Spring默认使用无参构造函数,userService就没有进行赋值
    //当无参构造函数删掉，此时也会报错，因为两个构造函数Spring不知道用哪个，所以需要告诉Sping用哪一个构造函数，使用@Autowired注解
    //setter方法注入
//    private UserService userService;
//    @Autowired
//    public void setUserService(UserService userService) {
//        this.userService = userService;
//    }

    public void doController(){
        userService.doService();
        System.out.println(user);
        System.out.println("do Controller...");
    }
}
